package com.itools.core.service.impl;

import com.alibaba.fastjson.JSON;
import com.itools.core.dto.accessToken.FmsAccessTokenDTO;
import com.itools.core.em.FmsCodeBean;
import com.itools.core.exception.AppException;
import com.itools.core.log.Logable;
import com.itools.core.mapper.FmsAccessTokenMapper;
import com.itools.core.result.FmsAccessTokenResult;
import com.itools.core.service.FmsAccessTokenService;
import com.itools.core.utils.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @description:
 * @author: XUCHANG
 * @create: 2021-03-28 15:51
 */
@Service
public class FmsAccessTokenServiceImpl implements FmsAccessTokenService {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private FmsAccessTokenMapper fmsAccessTokenMapper;
    /**
     * 从缓存中或者数据库中获取FsAccessToken信息
     *
     * @param fileAccessToken
     * @return
     */
    @Override
    public FmsAccessTokenResult getFileAccessToken(String fileAccessToken) {
        Object object =  redisTemplate.opsForValue().get(fileAccessToken);
        if (object != null){
            FmsAccessTokenResult result = JSON.parseObject((String) object, FmsAccessTokenResult.class);
            return result;
        }else {
            FmsAccessTokenDTO fssFmsAccessTokenDto = fmsAccessTokenMapper.selectByPrimaryKey(fileAccessToken);
            if (fssFmsAccessTokenDto == null){
                return null;
            }
            FmsAccessTokenResult result = new FmsAccessTokenResult();
            BeanUtils.copyProperties(fssFmsAccessTokenDto, result);
            return result;
        }
    }

    /**
     * 缓存FsAccessToken信息，如果过期时间小于等于0，则会将accessToken持久化（缓存到数据库）
     * @param fileAccessToken
     * @param expiredTime
     * @param maxAccessCount
     * @param uniqueId
     * @param type
     * @return
     */
    @Override
    public FmsAccessTokenResult cacheFileAccessToken(String fileAccessToken, int expiredTime, int maxAccessCount, String uniqueId, String type) {
        if (StringUtils.isBlank(fileAccessToken)) {
            throw new AppException(FmsCodeBean.FmsCode.FAIL.code);
        }
        FmsAccessTokenResult fmsAccessTokenResult = new FmsAccessTokenResult(expiredTime, maxAccessCount, uniqueId, type);
        if (expiredTime > 0){
            redisTemplate.opsForValue().set(fileAccessToken , JSON.toJSONString(fmsAccessTokenResult) , expiredTime , TimeUnit.MINUTES);
        }else {
            FmsAccessTokenDTO fssFmsAccessTokenDto = new FmsAccessTokenDTO();
            fssFmsAccessTokenDto.setFileAccessToken(fileAccessToken);
            fssFmsAccessTokenDto.setType(type);
            fssFmsAccessTokenDto.setUniqueId(uniqueId);
            fmsAccessTokenMapper.insert(fssFmsAccessTokenDto);
        }
        return fmsAccessTokenResult;
    }
    /**
     * 缓存FsAccessToken信息，如果过期时间小于等于0，则会将accessToken持久化（缓存到数据库）
     * @param fileAccessToken
     * @param expiredTime
     * @param maxAccessCount
     * @param uniqueIds
     * @param type
     * @return
     */
    public List<FmsAccessTokenDTO> cacheFileAccessToken(String fileAccessToken, int expiredTime, int maxAccessCount, List<String> uniqueIds, String type) {
        if (StringUtils.isBlank(fileAccessToken)) {
            throw new AppException(FmsCodeBean.FmsCode.FAIL.code);
        }
        List<FmsAccessTokenDTO> fssAccessTokens = new ArrayList<>();
        for (String uniqueId : uniqueIds){
            FmsAccessTokenResult fmsAccessTokenResult = new FmsAccessTokenResult(expiredTime, maxAccessCount, uniqueId, type);
            if (expiredTime > 0){
                redisTemplate.opsForValue().set(fileAccessToken , JSON.toJSONString(fmsAccessTokenResult) , expiredTime , TimeUnit.MINUTES);
            }else {
                FmsAccessTokenDTO fssFmsAccessTokenDto = new FmsAccessTokenDTO();
                fssFmsAccessTokenDto.setFileAccessToken(fileAccessToken);
                fssFmsAccessTokenDto.setType(type);
                fssFmsAccessTokenDto.setUniqueId(uniqueId);
                fssAccessTokens.add(fssFmsAccessTokenDto);
            }
        }
        if (!CollectionUtils.isEmpty(fssAccessTokens)){
            fmsAccessTokenMapper.multipartInsert(fssAccessTokens);
        }
        return fssAccessTokens;
    }
    
    /**
     * 删除缓存数据
     *
     * @param fileAccessToken
     */
    @Override
    @CacheEvict(value = "fileAccessToken", key = "#fileAccessToken")
    @Logable(businessTag = "FsAccessService")
    public void deleteFileAccessToken(String fileAccessToken) {
    }
}
